package com.example;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {

    private  Scanner sc=new Scanner(System.in);
    //用户集合
    private ArrayList<Account> accounts=new ArrayList<>();
    //记录登录后的当前用户
    private Account longinacc;




    //ATM欢迎界面
    public void start() {
        while (true) {
            System.out.println("============欢迎您进入到了ATM系统=========================");
            System.out.println("1、用户登录");
            System.out.println("2、用户开户");
            System.out.println("请选择：");

            //获取操作
            int command=sc.nextInt();
            switch (command){
                case 1:
                    //用户登录功能
                    login();
                    break;
                case 2:
                    //用户开户功能
                    creatAccount();
                    break;
                default:
                    System.out.println("没有该操作");
            }
        }

    }

    //用户登录功能
    private void login() {
        System.out.println("============================================================");
        System.out.println("==================欢迎进入登录操作页面=======================");
        //1.若当前用户集合中没有用户则表示不存在，不存在则直接结束登录操作
        if (accounts.size()==0){
            System.out.println("当前系统中无任何账号，请先开户再登录");
            return;//跳出登录操作
        }
        //2.系统中存在账号，可以开始登录操作
        while (true) {
            System.out.println("请输入您的卡号:");
            String cardId=sc.next();
            //3.判断这个卡号是否存在
            Account acc=getAccountByCardId(cardId);
            if (acc==null){
                System.out.println("您输入的卡号不存在，请重新输入：");
            }
            else {
                while (true) {
                    //卡号存在，则输入密码
                    System.out.println("请输入您的密码：");
                    String password=sc.next();
                    //判断密码是否正确
                    if(password.equals(acc.getPassword())){
                        longinacc=acc;
                        System.out.println("恭喜您，"+longinacc.getUserName()+"成功登录");
                        //登录成功后，显示登录后的页面
                        showUserCommand();
                        return;
                    }else {
                        System.out.println("您输入的密码有误");
                    }
                }
            }
        }
    }

    private void showUserCommand() {

        while (true) {
            System.out.println("============================================================");
            System.out.println("================欢迎进入登录后的操作页面======================");
            System.out.println("1、查询账户");
            System.out.println("2、存款");
            System.out.println("3、取款");
            System.out.println("4、转账");
            System.out.println("5、密码修改");
            System.out.println("6、退出");
            System.out.println("7、注销当前账户");

            System.out.println("请选择：");
            String command=sc.next();
            switch (command){
                case "1"://查询当前账户
                    showLoginAccount();
                    break;
                case "2"://存款
                    depositMoney();
                    break;
                case "3"://取款
                    drawMoney();
                    break;
                case "4"://转账
                    transformMoney();
                    break;
                case "5"://更新密码
                    updatePassword();
                    return;
                case "6"://退出
                    System.out.println(longinacc.getUserName()+"您退出系统成功");;
                    return;
                case "7"://注销当前账户
                    if(deleteAccount()){
                        return;
                    }
                    break;
                default:
                    System.out.println("请输入正确的操作数字");

            }
        }
    }

    //1.查询账户操作
    private void showLoginAccount() {
        System.out.println("=====================当前您的账户信息如下==========================");
        System.out.println("卡号："+longinacc.getCardId());
        System.out.println("户主："+longinacc.getUserName());
        System.out.println("性别："+longinacc.getSex());
        System.out.println("余额："+longinacc.getMoney());
        System.out.println("每次提现额度："+longinacc.getLimit());
    }
    //2.存款操作
    private void depositMoney() {
        System.out.println("=====================存款页面==========================");
        System.out.println("请输入存款金额：");
        //获取存款金额
        double money=sc.nextDouble();
        //存款成功后更新当前登录的账户余额
        longinacc.setMoney(longinacc.getMoney()+money);
        System.out.println("恭喜您存款成功，当前账户余额为："+longinacc.getMoney());

    }
    //3.取款
    private void drawMoney(){
        System.out.println("=====================取款页面==========================");
        //1.先判断账户余额是否达到了100元，如果不够100元，就不让用户取钱了
        if(longinacc.getMoney() < 100){
            System.out.println("对不起，您的账户余额小于100元，不允许取钱");
            return;
        }
        //2.用户输入取款金额
        while (true) {
            System.out.println("请输入取款金额（取款金额为整百元）：");
            double money=sc.nextDouble();
            //3.判断用户余额是否足够
            if(longinacc.getMoney() > money){
                //3.1足够，判断取款金额是否超过限额
                if (money>longinacc.getLimit()){
                    //3.1.1大于限额
                    System.out.println("对不起，取款金额大于限额" );
                    break;
                }else {
                    //3.1.2小于限额，则取钱
                    longinacc.setMoney(longinacc.getMoney()-money);
                    System.out.println("您取款"+money+"成功，余额为："+longinacc.getMoney());
                    return;
                }
            }else {
                //3.2不足够，提醒用户
                System.out.println("余额不足，您当前账户余额为："+longinacc.getMoney());
                return;
            }
        }


    }
    //4.转账
    private void transformMoney(){

    }
    //5.密码修改
    private void updatePassword(){
        System.out.println("=====================密码修改页面==========================");
        //5.1提醒用户认证当前密码
        while (true) {
            System.out.println("请输入当前账户密码：");
            String password=sc.next();
            //5.2认证当前的密码是否正确
            if (password.equals(longinacc.getPassword())){
                //5.3正确则输入新密码
                while (true) {
                    System.out.println("请输入新密码:");
                    String firstPassword=sc.next();
                    System.out.println("请再次确认输入的新密码:");
                    String secondPassword=sc.next();
                    //两次输入一致，则将当前用户密码改为新密码
                    if(firstPassword.equals(secondPassword)){
                        System.out.println("恭喜您修改密码成功，请重新登录");
                        longinacc.setPassword(secondPassword);
                        break;
                    }else {
                        System.out.println("您两次输入的密码不一致，请重新输入");
                    }
                }
                break;
            }else {
                System.out.println("您输入的密码不正确，请重新输入");
            }
        }

    }

    //7.销户
    private boolean deleteAccount(){
        System.out.println("=====================销户操作页面==========================");
        //询问用户是否确定要销户
        System.out.println("请问您确定要销户吗？y/n");
        String commmand=sc.next();
        switch (commmand){
            case "y":
                //用户确认销户
                //先判断用户账户是否有钱
                if (longinacc.getMoney()==0){
                    accounts.remove(longinacc);
                    System.out.println("您好，您的账户已销户成功");
                    return true;
                }else {
                    System.out.println("对不起，你的账户存有金额，不允许销户");
                    return false;
                }
            default:
                System.out.println("好的，您的账户保留");
                return false;
        }
    }


    //用户开户功能
    private void creatAccount() {
        System.out.println("============================================================");
        System.out.println("==================欢迎进入开户操作页面=======================");
        //记录当前用户
        Account acc=new Account();
        System.out.println("请输入你的姓名：");
        String name=sc.next();
        acc.setUserName(name);

        while (true) {
        System.out.println("请输入你的性别：");
        char sex = sc.next().charAt(0);

            if (sex == '男' || sex == '女') {
                acc.setSex(sex);
                break;
            } else{
                System.out.println("请输入正确的性别：");
            }
        }

        while (true) {
            System.out.println("请输入你的密码：");
            String password=sc.next();
            System.out.println("请再次确认你的密码：");
            String okPassword=sc.next();
            if (password.equals(okPassword)){
                acc.setPassword(password);
                break;
            }
            else {
                System.out.println("两次输入的密码不一致，请重新输入");
            }
        }

        System.out.println("请输入你的取款额度：");
        double limit=sc.nextDouble();
        acc.setLimit(limit);
        //为开户的用户随机生成一个八位数的卡号，且不能与其他用户的卡号重复
        String newCardId =createCard();
        acc.setCardId(newCardId);
        accounts.add(acc);
        System.out.println("恭喜您，"+acc.getUserName()+"开户成功，您的卡号是："+acc.getCardId());

    }

    //返回一个八位数的卡号，且这个卡号不能与其他用户的卡号重复
    private String createCard() {
        while (true) {
            //定义一个String类型的变量记住8位数字作为一个卡号
            String cardId="";
            Random r=new Random();
            //循环8次，每次生成一个随机数给cardId连接起来
            for (int i = 1; i <8 ; i++) {
                int data=r.nextInt(10);
                cardId += data;
            }
            //判断cardId卡号是否与已有用户卡号重复，没有重复，才可以作为一个卡号
            Account acc=getAccountByCardId(cardId);
            if(acc==null){
                //说明cardId没有找到账户对象，因此cardId没有与其他用户账号重复，可以作为一个卡号
                return cardId;
            }
        }
    }

    private Account getAccountByCardId(String cardId) {
        //遍历全部的账户对象
        for (int i = 0; i < accounts.size(); i++) {
            Account acc=accounts.get(i);
            //判断这个账户对象acc中的卡号是否是我们要找的卡号
            if(acc.getCardId().equals(cardId)){
                return acc;
            }
        }
        return null;//查无此用户，返回null
    }
}
